package copyShallowOrDeep;

/**
* @author jie
* @version 创建时间：2017年11月29日 下午9:17:16
* 类说明
*/
public class copyDemo2 {
	public static void main(String[] args) throws CloneNotSupportedException {
		Body body = new Body(new Head());

		Body body1 = (Body) body.clone();

		System.out.println("body == body1 : " + (body == body1));

		System.out.println("body.head == body1.head : " + (body.head == body1.head));
		//body == body1 : false
		//body.head == body1.head : false
		// 如果想要深拷贝一个对象， 这个对象必须要实现Cloneable接口，实现clone方法，
		//并且在clone方法内部，把该对象引用的其他对象也要clone一份 ，
		//这就要求这个被引用的对象必须也要实现Cloneable接口并且实现clone方法。 
		
		
		//那么，按照上面的结论， Body类组合了Head类， 而Head类组合了Face类，要想深拷贝Body类，必须在Body类的clone方法中将Head类也要拷贝一份，
		//但是在拷贝Head类时，默认执行的是浅拷贝，也就是说Head中组合的Face对象并不会被拷贝
		System.out.println("body.head.face == body1.head.face : " +  (body.head.face == body1.head.face));  
		      
		   
	}
}

class Body implements Cloneable {
	public Head head;

	public Body() {
	}

	public Body(Head head) {
		this.head = head;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		  Body newBody =  (Body) super.clone();  
	        newBody.head = (Head) head.clone();  
	        return newBody;  
	}

}

class Head implements Cloneable {
	public Face face;

	public Head() {
	}

	public Head(Face face) {
		this.face = face;
	}
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}

}

class Face implements Cloneable {
	public String faceColor;
	public int faceSize;

	public Face() {
		super();
	}

}